<?php

namespace IQuanResponse;

use Illuminate\Support\Facades\Response;
use Illuminate\Support\ServiceProvider;

class ResponseExtendProvider extends ServiceProvider
{
    /**
     * Bootstrap the application services.
     *
     * @return void
     */
    public function boot()
    {

        $service = $this;
        Response::macro('Success', function (array $message) use ($service) {
            $data = $service->create($message,200);
            $response = Response::make($data, $data['ret']);
            $info = $service->handleHeader($data['ret']);
            $response->header('Content-Info', $info);

            return $response;
        });

        Response::macro('Error', function (array $message) use ($service) {

            $data = $service->create($message,400);
            $response = Response::make($data, $data['ret']);
            $response->header('Content-Info', $service->handleHeader($data['ret']));

            return $response;
        });
    }

    public function create($data , $ret){

        $length = count($data);

        switch($length){
            case 1:
                if(is_array($data[0]) || is_object($data[0])){
                    $result['ret'] = $ret;
                    if(is_object($data[0])){
                        $result['data'] = $data[0]->toArray();
                    }else{
                        $result['data'] = $data[0];
                    }
                    $result['data'] = (array)$result['data'];
                    $result['msg'] = null;
                }else{
                    $result['ret'] = $ret;
                    $result['data'] = null;
                    $result['msg'] = $data[0];
                }

                break;
            case 2:
                if(is_array($data[0])){
                    $result['ret'] = $ret;
                    $result['data'] = (array)$data[0];
                }else{
                    $result['ret'] = $data[0];
                    $result['data'] = null;
                }
                $result['msg'] = $data[1];
                break;
            default:
                $validate = is_numeric($data[0]);
                if($validate){
                    $result['ret'] =  intval($data[0]);
                }else{
                    $result['ret'] = $ret;
                }
                $result['data'] = (array)$data[1];
                $result['msg'] = $data[2];
                break;
        }

        if(is_array($result['msg'])){
            $result['msg'] = null;
        }

        return $result;

    }

    public function handleHeader($ret){

        $httpHeader = array (
            100 => 'HTTP/1.1 100 Continue',
            101 => 'HTTP/1.1 101 Switching Protocols',
            200 => 'HTTP/1.1 200 OK',
            201 => 'HTTP/1.1 201 Created',
            202 => 'HTTP/1.1 202 Accepted',
            203 => 'HTTP/1.1 203 Non-Authoritative Information',
            204 => 'HTTP/1.1 204 No Content',
            205 => 'HTTP/1.1 205 Reset Content',
            206 => 'HTTP/1.1 206 Partial Content',
            300 => 'HTTP/1.1 300 Multiple Choices',
            301 => 'HTTP/1.1 301 Moved Permanently',
            302 => 'HTTP/1.1 302 Found',
            303 => 'HTTP/1.1 303 See Other',
            304 => 'HTTP/1.1 304 Not Modified',
            305 => 'HTTP/1.1 305 Use Proxy',
            307 => 'HTTP/1.1 307 Temporary Redirect',
            400 => 'HTTP/1.1 400 Bad Request',
            401 => 'HTTP/1.1 401 Unauthorized',
            402 => 'HTTP/1.1 402 Payment Required',
            403 => 'HTTP/1.1 403 Forbidden',
            404 => 'HTTP/1.1 404 Not Found',
            405 => 'HTTP/1.1 405 Method Not Allowed',
            406 => 'HTTP/1.1 406 Not Acceptable',
            407 => 'HTTP/1.1 407 Proxy Authentication Required',
            408 => 'HTTP/1.1 408 Request Time-out',
            409 => 'HTTP/1.1 409 Conflict',
            410 => 'HTTP/1.1 410 Gone',
            411 => 'HTTP/1.1 411 Length Required',
            412 => 'HTTP/1.1 412 Precondition Failed',
            413 => 'HTTP/1.1 413 Request Entity Too Large',
            414 => 'HTTP/1.1 414 Request-URI Too Large',
            415 => 'HTTP/1.1 415 Unsupported Media Type',
            416 => 'HTTP/1.1 416 Requested range not satisfiable',
            417 => 'HTTP/1.1 417 Expectation Failed',
            500 => 'HTTP/1.1 500 Internal Server Error',
            501 => 'HTTP/1.1 501 Not Implemented',
            502 => 'HTTP/1.1 502 Bad Gateway',
            503 => 'HTTP/1.1 503 Service Unavailable',
            504 => 'HTTP/1.1 504 Gateway Time-out',
            505 => 'HTTP/1.1 505 HTTP Version not supported',
        );

        return $httpHeader[$ret];
    }

    /**
     * Register the application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}
